/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	TopMenuCmpst.java
 * 模块说明：	
 * 修改历史：
 * Dec 18, 2007 - lxm - 创建。
 */
package com.hd123.rumba.gwt.entry.client;

import java.util.List;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.gwtext.client.widgets.MessageBox;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.entry.client.menu.QMenuItem;

/**
 * 顶级菜单 | 界面部件
 * 
 * @author lxm
 * 
 */
class TopMenuCmpst extends Composite {

  /**
   * 构造函数
   * 
   * @param entryPoint
   *          指定所属模块入口点。
   */
  public TopMenuCmpst(MainFrame entryPoint) {
    super();
    assert entryPoint != null;
    this.entryPoint = entryPoint;
    drawSelf();
  }

  /**
   * 刷新数据显示。
   * 
   */
  public void refresh() {
    MainFrameService.Locator.getService().getTopMenuItems(new AsyncCallback() {

      public void onFailure(Throwable t) {
        pnl.clear();
        pnl.add(new HTML(t.getMessage()));
        MessageBox.alert(Window.getTitle(), "取得主菜单信息是发生错误。\n" + t.getMessage());
      }

      public void onSuccess(Object result) {
        List menuItems = (List) result;
        try {
          refreshMenuItems(menuItems);
        } catch (ClientBizException e) {
          MessageBox.alert(Window.getTitle(), "刷新主菜单时发生错误。\n" + e.getMessage());
        }
        if (menuItems.size() > 0)
          entryPoint.clickTopMenuItem((QMenuItem) menuItems.get(0));
        else
          MessageBox.alert(Window.getTitle(), "主菜单为空。");
      }
    });
  }

  /**
   * 设置指定的菜单项为选中状态。将导致其它菜单项的显示状态为不选中。
   * 
   * @param menuItem
   *          指定被选中的菜单项。
   */
  public void selectMenuItem(QMenuItem menuItem) {
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      TopMenuItemCmpst wItem = (TopMenuItemCmpst) pnl.getWidget(i);
      boolean same = false;
      if (menuItem != null)
        same = menuItem.getId().equals(wItem.getMenuItem().getId());
      wItem.setSelected(same);
    }
  }

  // --------------------------------------------------------------------------
  // 数据
  // --------------------------------------------------------------------------

  /** 所属模块入口点 */
  private MainFrame entryPoint;

  public MainFrame getEntryPoint() {
    return this.entryPoint;
  }

  // --------------------------------------------------------------------------
  // 用户界面
  // --------------------------------------------------------------------------

  private HorizontalPanel pnl;

  private void drawSelf() {
    pnl = new HorizontalPanel();
    pnl.setSpacing(0);
    pnl.setHeight("25px");
    pnl.setVerticalAlignment(HorizontalPanel.ALIGN_BOTTOM);
    pnl.setStyleName("rb-topMenu");

    this.initWidget(pnl);
  }

  private void refreshMenuItems(List menuItems) throws ClientBizException {
    pnl.clear();
    for (int i = 0; i < menuItems.size(); i++) {
      QMenuItem item = (QMenuItem) menuItems.get(i);
      // 画出主菜单的界面部分。
      TopMenuItemCmpst wItem = new TopMenuItemCmpst(this);
      wItem.setMenuItem(item);
      pnl.add(wItem);
    }
  }
}
